1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    * 
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.lang3.builder;
18  
19  import static org.junit.Assert.assertEquals;
20  import static org.junit.Assert.assertTrue;
21  
22  import java.math.BigInteger;
23  
24  import org.junit.Test;
25  
26  /**
27   * Unit tests {@link org.apache.commons.lang3.builder.CompareToBuilder}.
28   *
29   * @version $Id$
30   */
31  public class CompareToBuilderTest {
32  
33      //-----------------------------------------------------------------------
34  
35      static class TestObject implements Comparable<TestObject> {
36          private int a;
37          public TestObject(final int a) {
38              this.a = a;
39          }
40          @Override
41          public boolean equals(final Object o) {
42              if (o == this) {
43                  return true;
44              }
45              if (!(o instanceof TestObject)) {
46                  return false;
47              }
48              final TestObject rhs = (TestObject) o;
49              return a == rhs.a;
50          }
51  
52          @Override
53          public int hashCode() {
54              return a;
55          }
56  
57          public void setA(final int a) {
58              this.a = a;
59          }
60  
61          public int getA() {
62              return a;
63          }
64          @Override
65          public int compareTo(final TestObject rhs) {
66              return a < rhs.a ? -1 : a > rhs.a ? +1 : 0;
67          }
68      }
69  
70      static class TestSubObject extends TestObject {
71          private int b;
72          public TestSubObject() {
73              super(0);
74          }
75          public TestSubObject(final int a, final int b) {
76              super(a);
77              this.b = b;
78          }
79          @Override
80          public boolean equals(final Object o) {
81              if (o == this) {
82                  return true;
83              }
84              if (!(o instanceof TestSubObject)) {
85                  return false;
86              }
87              final TestSubObject rhs = (TestSubObject) o;
88              return super.equals(o) && b == rhs.b;
89          }
90      }
91  
92      static class TestTransientSubObject extends TestObject {
93          @SuppressWarnings("unused")
94          private transient int t;
95          public TestTransientSubObject(final int a, final int t) {
96              super(a);
97              this.t = t;
98          }
99      }
100     
101     @Test
102     public void testReflectionCompare() {
103         final TestObject o1 = new TestObject(4);
104         final TestObject o2 = new TestObject(4);
105         assertTrue(CompareToBuilder.reflectionCompare(o1, o1) == 0);
106         assertTrue(CompareToBuilder.reflectionCompare(o1, o2) == 0);
107         o2.setA(5);
108         assertTrue(CompareToBuilder.reflectionCompare(o1, o2) < 0);
109         assertTrue(CompareToBuilder.reflectionCompare(o2, o1) > 0);
110     }
111 
112     @Test(expected=NullPointerException.class)
113     public void testReflectionCompareEx1() {
114         final TestObject o1 = new TestObject(4);
115         CompareToBuilder.reflectionCompare(o1, null);
116     }
117 
118     @Test(expected=ClassCastException.class)
119     public void testReflectionCompareEx2() {
120         final TestObject o1 = new TestObject(4);
121         final Object o2 = new Object();
122         CompareToBuilder.reflectionCompare(o1, o2);
123     }
124 
125     @Test
126     public void testReflectionHierarchyCompare() {
127         testReflectionHierarchyCompare(false, null);
128     }
129     
130     @Test
131     public void testReflectionHierarchyCompareExcludeFields() {
132         final String[] excludeFields = new String[] { "b" };
133         testReflectionHierarchyCompare(true, excludeFields);
134         
135         TestSubObject x;
136         TestSubObject y;
137         TestSubObject z;
138         
139         x = new TestSubObject(1, 1);
140         y = new TestSubObject(2, 1);
141         z = new TestSubObject(3, 1);
142         assertXYZCompareOrder(x, y, z, true, excludeFields);
143 
144         x = new TestSubObject(1, 3);
145         y = new TestSubObject(2, 2);
146         z = new TestSubObject(3, 1);
147         assertXYZCompareOrder(x, y, z, true, excludeFields);
148     }
149     
150     @Test
151     public void testReflectionHierarchyCompareTransients() {
152         testReflectionHierarchyCompare(true, null);
153 
154         TestTransientSubObject x;
155         TestTransientSubObject y;
156         TestTransientSubObject z;
157 
158         x = new TestTransientSubObject(1, 1);
159         y = new TestTransientSubObject(2, 2);
160         z = new TestTransientSubObject(3, 3);
161         assertXYZCompareOrder(x, y, z, true, null);
162         
163         x = new TestTransientSubObject(1, 1);
164         y = new TestTransientSubObject(1, 2);
165         z = new TestTransientSubObject(1, 3);
166         assertXYZCompareOrder(x, y, z, true, null);  
167     }
168     
169     private void assertXYZCompareOrder(final Object x, final Object y, final Object z, final boolean testTransients, final String[] excludeFields) {
170         assertTrue(0 == CompareToBuilder.reflectionCompare(x, x, testTransients, null, excludeFields));
171         assertTrue(0 == CompareToBuilder.reflectionCompare(y, y, testTransients, null, excludeFields));
172         assertTrue(0 == CompareToBuilder.reflectionCompare(z, z, testTransients, null, excludeFields));
173         
174         assertTrue(0 > CompareToBuilder.reflectionCompare(x, y, testTransients, null, excludeFields));
175         assertTrue(0 > CompareToBuilder.reflectionCompare(x, z, testTransients, null, excludeFields));
176         assertTrue(0 > CompareToBuilder.reflectionCompare(y, z, testTransients, null, excludeFields));
177         
178         assertTrue(0 < CompareToBuilder.reflectionCompare(y, x, testTransients, null, excludeFields));
179         assertTrue(0 < CompareToBuilder.reflectionCompare(z, x, testTransients, null, excludeFields));
180         assertTrue(0 < CompareToBuilder.reflectionCompare(z, y, testTransients, null, excludeFields));
181     }
182     
183     private void testReflectionHierarchyCompare(final boolean testTransients, final String[] excludeFields) {
184         final TestObject to1 = new TestObject(1);
185         final TestObject to2 = new TestObject(2);
186         final TestObject to3 = new TestObject(3);
187         final TestSubObject tso1 = new TestSubObject(1, 1);
188         final TestSubObject tso2 = new TestSubObject(2, 2);
189         final TestSubObject tso3 = new TestSubObject(3, 3);
190         
191         assertReflectionCompareContract(to1, to1, to1, false, excludeFields);
192         assertReflectionCompareContract(to1, to2, to3, false, excludeFields);
193         assertReflectionCompareContract(tso1, tso1, tso1, false, excludeFields);
194         assertReflectionCompareContract(tso1, tso2, tso3, false, excludeFields);
195         assertReflectionCompareContract("1", "2", "3", false, excludeFields);
196         
197         assertTrue(0 != CompareToBuilder.reflectionCompare(tso1, new TestSubObject(1, 0), testTransients));
198         assertTrue(0 != CompareToBuilder.reflectionCompare(tso1, new TestSubObject(0, 1), testTransients));
199 
200         // root class
201         assertXYZCompareOrder(to1, to2, to3, true, null);
202         // subclass  
203         assertXYZCompareOrder(tso1, tso2, tso3, true, null);  
204     }
205 
206     /**
207      * See "Effective Java" under "Consider Implementing Comparable".
208      *  
209      * @param x an object to compare 
210      * @param y an object to compare
211      * @param z an object to compare
212      * @param testTransients Whether to include transients in the comparison
213      * @param excludeFields fields to exclude
214      */
215     private void assertReflectionCompareContract(final Object x, final Object y, final Object z, final boolean testTransients, final String[] excludeFields) {
216 
217         // signum
218         assertTrue(reflectionCompareSignum(x, y, testTransients, excludeFields) == -reflectionCompareSignum(y, x, testTransients, excludeFields));
219         
220         // transitive
221         if (CompareToBuilder.reflectionCompare(x, y, testTransients, null, excludeFields) > 0 
222                 && CompareToBuilder.reflectionCompare(y, z, testTransients, null, excludeFields) > 0){
223             assertTrue(CompareToBuilder.reflectionCompare(x, z, testTransients, null, excludeFields) > 0);
224         }
225         
226         // un-named
227         if (CompareToBuilder.reflectionCompare(x, y, testTransients, null, excludeFields) == 0) {
228             assertTrue(reflectionCompareSignum(x, z, testTransients, excludeFields) == -reflectionCompareSignum(y, z, testTransients, excludeFields));
229         }
230         
231         // strongly recommended but not strictly required
232         assertTrue(CompareToBuilder.reflectionCompare(x, y, testTransients) ==0 == EqualsBuilder.reflectionEquals(x, y, testTransients));
233     }
234     
235     /**
236      * Returns the signum of the result of comparing x and y with
237      * <code>CompareToBuilder.reflectionCompare</code>
238      * 
239      * @param lhs The "left-hand-side" of the comparison.
240      * @param rhs The "right-hand-side" of the comparison.
241      * @param testTransients Whether to include transients in the comparison
242      * @param excludeFields fields to exclude
243      * @return int The signum
244      */
245     private int reflectionCompareSignum(final Object lhs, final Object rhs, final boolean testTransients, final String[] excludeFields) {
246         return BigInteger.valueOf(CompareToBuilder.reflectionCompare(lhs, rhs, testTransients)).signum();
247     }
248     
249     @Test
250     public void testAppendSuper() {
251         final TestObject o1 = new TestObject(4);
252         final TestObject o2 = new TestObject(5);
253         assertTrue(new CompareToBuilder().appendSuper(0).append(o1, o1).toComparison() == 0);
254         assertTrue(new CompareToBuilder().appendSuper(0).append(o1, o2).toComparison() < 0);
255         assertTrue(new CompareToBuilder().appendSuper(0).append(o2, o1).toComparison() > 0);
256         
257         assertTrue(new CompareToBuilder().appendSuper(-1).append(o1, o1).toComparison() < 0);
258         assertTrue(new CompareToBuilder().appendSuper(-1).append(o1, o2).toComparison() < 0);
259         
260         assertTrue(new CompareToBuilder().appendSuper(1).append(o1, o1).toComparison() > 0);
261         assertTrue(new CompareToBuilder().appendSuper(1).append(o1, o2).toComparison() > 0);
262     }
263     
264     @Test
265     public void testObject() {
266         final TestObject o1 = new TestObject(4);
267         final TestObject o2 = new TestObject(4);
268         assertTrue(new CompareToBuilder().append(o1, o1).toComparison() == 0);
269         assertTrue(new CompareToBuilder().append(o1, o2).toComparison() == 0);
270         o2.setA(5);
271         assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
272         assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
273         
274         assertTrue(new CompareToBuilder().append(o1, null).toComparison() > 0);
275         assertTrue(new CompareToBuilder().append((Object) null, (Object) null).toComparison() == 0);
276         assertTrue(new CompareToBuilder().append(null, o1).toComparison() < 0);
277     }
278     
279     @Test
280     public void testObjectBuild() {
281         final TestObject o1 = new TestObject(4);
282         final TestObject o2 = new TestObject(4);
283         assertEquals(Integer.valueOf(0), new CompareToBuilder().append(o1, o1).build());
284         assertEquals(Integer.valueOf(0), new CompareToBuilder().append(o1, o2).build());
285         o2.setA(5);
286         assertTrue(new CompareToBuilder().append(o1, o2).build().intValue() < 0);
287         assertTrue(new CompareToBuilder().append(o2, o1).build().intValue() > 0);
288         
289         assertTrue(new CompareToBuilder().append(o1, null).build().intValue() > 0);
290         assertEquals(Integer.valueOf(0), new CompareToBuilder().append((Object) null, (Object) null).build());
291         assertTrue(new CompareToBuilder().append(null, o1).build().intValue() < 0);
292     }
293 
294     @Test(expected=ClassCastException.class)
295     public void testObjectEx2() {
296         final TestObject o1 = new TestObject(4);
297         final Object o2 = new Object();
298         new CompareToBuilder().append(o1, o2);
299     }
300 
301     @Test
302     public void testObjectComparator() {
303         final String o1 = "Fred";
304         String o2 = "Fred";
305         assertTrue(new CompareToBuilder().append(o1, o1, String.CASE_INSENSITIVE_ORDER).toComparison() == 0);
306         assertTrue(new CompareToBuilder().append(o1, o2, String.CASE_INSENSITIVE_ORDER).toComparison() == 0);
307         o2 = "FRED";
308         assertTrue(new CompareToBuilder().append(o1, o2, String.CASE_INSENSITIVE_ORDER).toComparison() == 0);
309         assertTrue(new CompareToBuilder().append(o2, o1, String.CASE_INSENSITIVE_ORDER).toComparison() == 0);
310         o2 = "FREDA";
311         assertTrue(new CompareToBuilder().append(o1, o2, String.CASE_INSENSITIVE_ORDER).toComparison() < 0);
312         assertTrue(new CompareToBuilder().append(o2, o1, String.CASE_INSENSITIVE_ORDER).toComparison() > 0);
313         
314         assertTrue(new CompareToBuilder().append(o1, null, String.CASE_INSENSITIVE_ORDER).toComparison() > 0);
315         assertTrue(new CompareToBuilder().append((Object) null, (Object) null, String.CASE_INSENSITIVE_ORDER).toComparison() == 0);
316         assertTrue(new CompareToBuilder().append(null, o1, String.CASE_INSENSITIVE_ORDER).toComparison() < 0);
317     }
318     
319     @Test
320     public void testObjectComparatorNull() {
321         final String o1 = "Fred";
322         String o2 = "Fred";
323         assertTrue(new CompareToBuilder().append(o1, o1, null).toComparison() == 0);
324         assertTrue(new CompareToBuilder().append(o1, o2, null).toComparison() == 0);
325         o2 = "Zebra";
326         assertTrue(new CompareToBuilder().append(o1, o2, null).toComparison() < 0);
327         assertTrue(new CompareToBuilder().append(o2, o1, null).toComparison() > 0);
328         
329         assertTrue(new CompareToBuilder().append(o1, null, null).toComparison() > 0);
330         assertTrue(new CompareToBuilder().append((Object) null, (Object) null, null).toComparison() == 0);
331         assertTrue(new CompareToBuilder().append(null, o1, null).toComparison() < 0);
332     }
333 
334     @Test
335     public void testLong() {
336         final long o1 = 1L;
337         final long o2 = 2L;
338         assertTrue(new CompareToBuilder().append(o1, o1).toComparison() == 0);
339         assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
340         assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
341         assertTrue(new CompareToBuilder().append(o1, Long.MAX_VALUE).toComparison() < 0);
342         assertTrue(new CompareToBuilder().append(Long.MAX_VALUE, o1).toComparison() > 0);
343         assertTrue(new CompareToBuilder().append(o1, Long.MIN_VALUE).toComparison() > 0);
344         assertTrue(new CompareToBuilder().append(Long.MIN_VALUE, o1).toComparison() < 0);
345     }
346 
347     @Test
348     public void testInt() {
349         final int o1 = 1;
350         final int o2 = 2;
351         assertTrue(new CompareToBuilder().append(o1, o1).toComparison() == 0);
352         assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
353         assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
354         assertTrue(new CompareToBuilder().append(o1, Integer.MAX_VALUE).toComparison() < 0);
355         assertTrue(new CompareToBuilder().append(Integer.MAX_VALUE, o1).toComparison() > 0);
356         assertTrue(new CompareToBuilder().append(o1, Integer.MIN_VALUE).toComparison() > 0);
357         assertTrue(new CompareToBuilder().append(Integer.MIN_VALUE, o1).toComparison() < 0);
358     }
359 
360     @Test
361     public void testShort() {
362         final short o1 = 1;
363         final short o2 = 2;
364         assertTrue(new CompareToBuilder().append(o1, o1).toComparison() == 0);
365         assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
366         assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
367         assertTrue(new CompareToBuilder().append(o1, Short.MAX_VALUE).toComparison() < 0);
368         assertTrue(new CompareToBuilder().append(Short.MAX_VALUE, o1).toComparison() > 0);
369         assertTrue(new CompareToBuilder().append(o1, Short.MIN_VALUE).toComparison() > 0);
370         assertTrue(new CompareToBuilder().append(Short.MIN_VALUE, o1).toComparison() < 0);
371     }
372 
373     @Test
374     public void testChar() {
375         final char o1 = 1;
376         final char o2 = 2;
377         assertTrue(new CompareToBuilder().append(o1, o1).toComparison() == 0);
378         assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
379         assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
380         assertTrue(new CompareToBuilder().append(o1, Character.MAX_VALUE).toComparison() < 0);
381         assertTrue(new CompareToBuilder().append(Character.MAX_VALUE, o1).toComparison() > 0);
382         assertTrue(new CompareToBuilder().append(o1, Character.MIN_VALUE).toComparison() > 0);
383         assertTrue(new CompareToBuilder().append(Character.MIN_VALUE, o1).toComparison() < 0);
384     }
385 
386     @Test
387     public void testByte() {
388         final byte o1 = 1;
389         final byte o2 = 2;
390         assertTrue(new CompareToBuilder().append(o1, o1).toComparison() == 0);
391         assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
392         assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
393         assertTrue(new CompareToBuilder().append(o1, Byte.MAX_VALUE).toComparison() < 0);
394         assertTrue(new CompareToBuilder().append(Byte.MAX_VALUE, o1).toComparison() > 0);
395         assertTrue(new CompareToBuilder().append(o1, Byte.MIN_VALUE).toComparison() > 0);
396         assertTrue(new CompareToBuilder().append(Byte.MIN_VALUE, o1).toComparison() < 0);
397     }
398 
399     @Test
400     public void testDouble() {
401         final double o1 = 1;
402         final double o2 = 2;
403         assertTrue(new CompareToBuilder().append(o1, o1).toComparison() == 0);
404         assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
405         assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
406         assertTrue(new CompareToBuilder().append(o1, Double.MAX_VALUE).toComparison() < 0);
407         assertTrue(new CompareToBuilder().append(Double.MAX_VALUE, o1).toComparison() > 0);
408         assertTrue(new CompareToBuilder().append(o1, Double.MIN_VALUE).toComparison() > 0);
409         assertTrue(new CompareToBuilder().append(Double.MIN_VALUE, o1).toComparison() < 0);
410         assertTrue(new CompareToBuilder().append(Double.NaN, Double.NaN).toComparison() == 0);
411         assertTrue(new CompareToBuilder().append(Double.NaN, Double.MAX_VALUE).toComparison() > 0);
412         assertTrue(new CompareToBuilder().append(Double.POSITIVE_INFINITY, Double.MAX_VALUE).toComparison() > 0);
413         assertTrue(new CompareToBuilder().append(Double.NEGATIVE_INFINITY, Double.MIN_VALUE).toComparison() < 0);
414         assertTrue(new CompareToBuilder().append(o1, Double.NaN).toComparison() < 0);
415         assertTrue(new CompareToBuilder().append(Double.NaN, o1).toComparison() > 0);
416         assertTrue(new CompareToBuilder().append(-0.0, 0.0).toComparison() < 0);
417         assertTrue(new CompareToBuilder().append(0.0, -0.0).toComparison() > 0);
418     }
419 
420     @Test
421     public void testFloat() {
422         final float o1 = 1;
423         final float o2 = 2;
424         assertTrue(new CompareToBuilder().append(o1, o1).toComparison() == 0);
425         assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
426         assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
427         assertTrue(new CompareToBuilder().append(o1, Float.MAX_VALUE).toComparison() < 0);
428         assertTrue(new CompareToBuilder().append(Float.MAX_VALUE, o1).toComparison() > 0);
429         assertTrue(new CompareToBuilder().append(o1, Float.MIN_VALUE).toComparison() > 0);
430         assertTrue(new CompareToBuilder().append(Float.MIN_VALUE, o1).toComparison() < 0);
431         assertTrue(new CompareToBuilder().append(Float.NaN, Float.NaN).toComparison() == 0);
432         assertTrue(new CompareToBuilder().append(Float.NaN, Float.MAX_VALUE).toComparison() > 0);
433         assertTrue(new CompareToBuilder().append(Float.POSITIVE_INFINITY, Float.MAX_VALUE).toComparison() > 0);
434         assertTrue(new CompareToBuilder().append(Float.NEGATIVE_INFINITY, Float.MIN_VALUE).toComparison() < 0);
435         assertTrue(new CompareToBuilder().append(o1, Float.NaN).toComparison() < 0);
436         assertTrue(new CompareToBuilder().append(Float.NaN, o1).toComparison() > 0);
437         assertTrue(new CompareToBuilder().append(-0.0, 0.0).toComparison() < 0);
438         assertTrue(new CompareToBuilder().append(0.0, -0.0).toComparison() > 0);
439     }
440 
441     @Test
442     public void testBoolean() {
443         final boolean o1 = true;
444         final boolean o2 = false;
445         assertTrue(new CompareToBuilder().append(o1, o1).toComparison() == 0);
446         assertTrue(new CompareToBuilder().append(o2, o2).toComparison() == 0);
447         assertTrue(new CompareToBuilder().append(o1, o2).toComparison() > 0);
448         assertTrue(new CompareToBuilder().append(o2, o1).toComparison() < 0);
449     }
450 
451     @Test
452     public void testObjectArray() {
453         final TestObject[] obj1 = new TestObject[2];
454         obj1[0] = new TestObject(4);
455         obj1[1] = new TestObject(5);
456         final TestObject[] obj2 = new TestObject[2];
457         obj2[0] = new TestObject(4);
458         obj2[1] = new TestObject(5);
459         final TestObject[] obj3 = new TestObject[3];
460         obj3[0] = new TestObject(4);
461         obj3[1] = new TestObject(5);
462         obj3[2] = new TestObject(6);
463         
464         assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
465         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
466         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
467         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
468         
469         obj1[1] = new TestObject(7);
470         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
471         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
472 
473         assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
474         assertTrue(new CompareToBuilder().append((Object[]) null, (Object[]) null).toComparison() == 0);
475         assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
476     }
477 
478     @Test
479     public void testLongArray() {
480         final long[] obj1 = new long[2];
481         obj1[0] = 5L;
482         obj1[1] = 6L;
483         final long[] obj2 = new long[2];
484         obj2[0] = 5L;
485         obj2[1] = 6L;
486         final long[] obj3 = new long[3];
487         obj3[0] = 5L;
488         obj3[1] = 6L;
489         obj3[2] = 7L;
490         
491         assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
492         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
493         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
494         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
495 
496         obj1[1] = 7;
497         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
498         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
499 
500         assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
501         assertTrue(new CompareToBuilder().append((long[]) null, (long[]) null).toComparison() == 0);
502         assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
503     }
504 
505     @Test
506     public void testIntArray() {
507         final int[] obj1 = new int[2];
508         obj1[0] = 5;
509         obj1[1] = 6;
510         final int[] obj2 = new int[2];
511         obj2[0] = 5;
512         obj2[1] = 6;
513         final int[] obj3 = new int[3];
514         obj3[0] = 5;
515         obj3[1] = 6;
516         obj3[2] = 7;
517 
518         assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
519         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
520         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
521         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
522 
523         obj1[1] = 7;
524         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
525         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
526 
527         assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
528         assertTrue(new CompareToBuilder().append((int[]) null, (int[]) null).toComparison() == 0);
529         assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
530     }
531 
532     @Test
533     public void testShortArray() {
534         final short[] obj1 = new short[2];
535         obj1[0] = 5;
536         obj1[1] = 6;
537         final short[] obj2 = new short[2];
538         obj2[0] = 5;
539         obj2[1] = 6;
540         final short[] obj3 = new short[3];
541         obj3[0] = 5;
542         obj3[1] = 6;
543         obj3[2] = 7;
544 
545         assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
546         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
547         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
548         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
549 
550         obj1[1] = 7;
551         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
552         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
553 
554         assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
555         assertTrue(new CompareToBuilder().append((short[]) null, (short[]) null).toComparison() == 0);
556         assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
557     }
558 
559     @Test
560     public void testCharArray() {
561         final char[] obj1 = new char[2];
562         obj1[0] = 5;
563         obj1[1] = 6;
564         final char[] obj2 = new char[2];
565         obj2[0] = 5;
566         obj2[1] = 6;
567         final char[] obj3 = new char[3];
568         obj3[0] = 5;
569         obj3[1] = 6;
570         obj3[2] = 7;
571 
572         assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
573         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
574         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
575         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
576 
577         obj1[1] = 7;
578         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
579         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
580 
581         assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
582         assertTrue(new CompareToBuilder().append((char[]) null, (char[]) null).toComparison() == 0);
583         assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
584     }
585 
586     @Test
587     public void testByteArray() {
588         final byte[] obj1 = new byte[2];
589         obj1[0] = 5;
590         obj1[1] = 6;
591         final byte[] obj2 = new byte[2];
592         obj2[0] = 5;
593         obj2[1] = 6;
594         final byte[] obj3 = new byte[3];
595         obj3[0] = 5;
596         obj3[1] = 6;
597         obj3[2] = 7;
598 
599         assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
600         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
601         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
602         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
603 
604         obj1[1] = 7;
605         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
606         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
607 
608         assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
609         assertTrue(new CompareToBuilder().append((byte[]) null, (byte[]) null).toComparison() == 0);
610         assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
611     }
612 
613     @Test
614     public void testDoubleArray() {
615         final double[] obj1 = new double[2];
616         obj1[0] = 5;
617         obj1[1] = 6;
618         final double[] obj2 = new double[2];
619         obj2[0] = 5;
620         obj2[1] = 6;
621         final double[] obj3 = new double[3];
622         obj3[0] = 5;
623         obj3[1] = 6;
624         obj3[2] = 7;
625 
626         assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
627         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
628         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
629         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
630 
631         obj1[1] = 7;
632         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
633         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
634 
635         assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
636         assertTrue(new CompareToBuilder().append((double[]) null, (double[]) null).toComparison() == 0);
637         assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
638     }
639 
640     @Test
641     public void testFloatArray() {
642         final float[] obj1 = new float[2];
643         obj1[0] = 5;
644         obj1[1] = 6;
645         final float[] obj2 = new float[2];
646         obj2[0] = 5;
647         obj2[1] = 6;
648         final float[] obj3 = new float[3];
649         obj3[0] = 5;
650         obj3[1] = 6;
651         obj3[2] = 7;
652 
653         assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
654         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
655         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
656         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
657 
658         obj1[1] = 7;
659         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
660         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
661 
662         assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
663         assertTrue(new CompareToBuilder().append((float[]) null, (float[]) null).toComparison() == 0);
664         assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
665     }
666 
667     @Test
668     public void testBooleanArray() {
669         final boolean[] obj1 = new boolean[2];
670         obj1[0] = true;
671         obj1[1] = false;
672         final boolean[] obj2 = new boolean[2];
673         obj2[0] = true;
674         obj2[1] = false;
675         final boolean[] obj3 = new boolean[3];
676         obj3[0] = true;
677         obj3[1] = false;
678         obj3[2] = true;
679 
680         assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
681         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
682         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
683         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
684 
685         obj1[1] = true;
686         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
687         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
688 
689         assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
690         assertTrue(new CompareToBuilder().append((boolean[]) null, (boolean[]) null).toComparison() == 0);
691         assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
692     }
693 
694     @Test
695     public void testMultiLongArray() {
696         final long[][] array1 = new long[2][2];
697         final long[][] array2 = new long[2][2];
698         final long[][] array3 = new long[2][3];
699         for (int i = 0; i < array1.length; ++i) {
700             for (int j = 0; j < array1[0].length; j++) {
701                 array1[i][j] = (i + 1) * (j + 1);
702                 array2[i][j] = (i + 1) * (j + 1);
703                 array3[i][j] = (i + 1) * (j + 1);
704             }
705         }
706         array3[1][2] = 100;
707         array3[1][2] = 100;
708         
709         assertTrue(new CompareToBuilder().append(array1, array1).toComparison() == 0);
710         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() == 0);
711         assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
712         assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
713         array1[1][1] = 200;
714         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
715         assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
716     }
717 
718     @Test
719     public void testMultiIntArray() {
720         final int[][] array1 = new int[2][2];
721         final int[][] array2 = new int[2][2];
722         final int[][] array3 = new int[2][3];
723         for (int i = 0; i < array1.length; ++i) {
724             for (int j = 0; j < array1[0].length; j++) {
725                 array1[i][j] = (i + 1) * (j + 1);
726                 array2[i][j] = (i + 1) * (j + 1);
727                 array3[i][j] = (i + 1) * (j + 1);
728             }
729         }
730         array3[1][2] = 100;
731         array3[1][2] = 100;
732         
733         assertTrue(new CompareToBuilder().append(array1, array1).toComparison() == 0);
734         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() == 0);
735         assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
736         assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
737         array1[1][1] = 200;
738         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
739         assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
740     }
741 
742     @Test
743     public void testMultiShortArray() {
744         final short[][] array1 = new short[2][2];
745         final short[][] array2 = new short[2][2];
746         final short[][] array3 = new short[2][3];
747         for (short i = 0; i < array1.length; ++i) {
748             for (short j = 0; j < array1[0].length; j++) {
749                 array1[i][j] = (short)((i + 1) * (j + 1));
750                 array2[i][j] = (short)((i + 1) * (j + 1));
751                 array3[i][j] = (short)((i + 1) * (j + 1));
752             }
753         }
754         array3[1][2] = 100;
755         array3[1][2] = 100;
756         
757         assertTrue(new CompareToBuilder().append(array1, array1).toComparison() == 0);
758         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() == 0);
759         assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
760         assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
761         array1[1][1] = 200;
762         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
763         assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
764     }
765 
766     @Test
767     public void testMultiCharArray() {
768         final char[][] array1 = new char[2][2];
769         final char[][] array2 = new char[2][2];
770         final char[][] array3 = new char[2][3];
771         for (short i = 0; i < array1.length; ++i) {
772             for (short j = 0; j < array1[0].length; j++) {
773                 array1[i][j] = (char)((i + 1) * (j + 1));
774                 array2[i][j] = (char)((i + 1) * (j + 1));
775                 array3[i][j] = (char)((i + 1) * (j + 1));
776             }
777         }
778         array3[1][2] = 100;
779         array3[1][2] = 100;
780         
781         assertTrue(new CompareToBuilder().append(array1, array1).toComparison() == 0);
782         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() == 0);
783         assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
784         assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
785         array1[1][1] = 200;
786         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
787         assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
788     }
789 
790     @Test
791     public void testMultiByteArray() {
792         final byte[][] array1 = new byte[2][2];
793         final byte[][] array2 = new byte[2][2];
794         final byte[][] array3 = new byte[2][3];
795         for (byte i = 0; i < array1.length; ++i) {
796             for (byte j = 0; j < array1[0].length; j++) {
797                 array1[i][j] = (byte)((i + 1) * (j + 1));
798                 array2[i][j] = (byte)((i + 1) * (j + 1));
799                 array3[i][j] = (byte)((i + 1) * (j + 1));
800             }
801         }
802         array3[1][2] = 100;
803         array3[1][2] = 100;
804         
805         assertTrue(new CompareToBuilder().append(array1, array1).toComparison() == 0);
806         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() == 0);
807         assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
808         assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
809         array1[1][1] = 127;
810         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
811         assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
812     }
813     
814     @Test
815     public void testMultiFloatArray() {
816         final float[][] array1 = new float[2][2];
817         final float[][] array2 = new float[2][2];
818         final float[][] array3 = new float[2][3];
819         for (int i = 0; i < array1.length; ++i) {
820             for (int j = 0; j < array1[0].length; j++) {
821                 array1[i][j] = (i + 1) * (j + 1);
822                 array2[i][j] = (i + 1) * (j + 1);
823                 array3[i][j] = (i + 1) * (j + 1);
824             }
825         }
826         array3[1][2] = 100;
827         array3[1][2] = 100;
828         
829         assertTrue(new CompareToBuilder().append(array1, array1).toComparison() == 0);
830         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() == 0);
831         assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
832         assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
833         array1[1][1] = 127;
834         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
835         assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
836     }
837 
838     @Test
839     public void testMultiDoubleArray() {
840         final double[][] array1 = new double[2][2];
841         final double[][] array2 = new double[2][2];
842         final double[][] array3 = new double[2][3];
843         for (int i = 0; i < array1.length; ++i) {
844             for (int j = 0; j < array1[0].length; j++) {
845                 array1[i][j] = (i + 1) * (j + 1);
846                 array2[i][j] = (i + 1) * (j + 1);
847                 array3[i][j] = (i + 1) * (j + 1);
848             }
849         }
850         array3[1][2] = 100;
851         array3[1][2] = 100;
852         
853         assertTrue(new CompareToBuilder().append(array1, array1).toComparison() == 0);
854         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() == 0);
855         assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
856         assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
857         array1[1][1] = 127;
858         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
859         assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
860     }
861 
862     @Test
863     public void testMultiBooleanArray() {
864         final boolean[][] array1 = new boolean[2][2];
865         final boolean[][] array2 = new boolean[2][2];
866         final boolean[][] array3 = new boolean[2][3];
867         for (int i = 0; i < array1.length; ++i) {
868             for (int j = 0; j < array1[0].length; j++) {
869                 array1[i][j] = i == 1 ^ j == 1;
870                 array2[i][j] = i == 1 ^ j == 1;
871                 array3[i][j] = i == 1 ^ j == 1;
872             }
873         }
874         array3[1][2] = false;
875         array3[1][2] = false;
876         
877         assertTrue(new CompareToBuilder().append(array1, array1).toComparison() == 0);
878         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() == 0);
879         assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
880         assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
881         array1[1][1] = true;
882         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
883         assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
884     }
885 
886     @Test
887     public void testRaggedArray() {
888         final long array1[][] = new long[2][];
889         final long array2[][] = new long[2][];
890         final long array3[][] = new long[3][];
891         for (int i = 0; i < array1.length; ++i) {
892             array1[i] = new long[2];
893             array2[i] = new long[2];
894             array3[i] = new long[3];
895             for (int j = 0; j < array1[i].length; ++j) {
896                 array1[i][j] = (i + 1) * (j + 1);
897                 array2[i][j] = (i + 1) * (j + 1);
898                 array3[i][j] = (i + 1) * (j + 1);
899             }
900         }
901         array3[1][2] = 100;
902         array3[1][2] = 100;
903         
904         
905         assertTrue(new CompareToBuilder().append(array1, array1).toComparison() == 0);
906         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() == 0);
907         assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
908         assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
909         array1[1][1] = 200;
910         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
911         assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
912     }
913 
914     @Test
915     public void testMixedArray() {
916         final Object array1[] = new Object[2];
917         final Object array2[] = new Object[2];
918         final Object array3[] = new Object[2];
919         for (int i = 0; i < array1.length; ++i) {
920             array1[i] = new long[2];
921             array2[i] = new long[2];
922             array3[i] = new long[3];
923             for (int j = 0; j < 2; ++j) {
924                 ((long[]) array1[i])[j] = (i + 1) * (j + 1);
925                 ((long[]) array2[i])[j] = (i + 1) * (j + 1);
926                 ((long[]) array3[i])[j] = (i + 1) * (j + 1);
927             }
928         }
929         ((long[]) array3[0])[2] = 1;
930         ((long[]) array3[1])[2] = 1;
931         assertTrue(new CompareToBuilder().append(array1, array1).toComparison() == 0);
932         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() == 0);
933         assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
934         assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
935         ((long[]) array1[1])[1] = 200;
936         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
937         assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
938     }
939 
940     @Test
941     public void testObjectArrayHiddenByObject() {
942         final TestObject[] array1 = new TestObject[2];
943         array1[0] = new TestObject(4);
944         array1[1] = new TestObject(5);
945         final TestObject[] array2 = new TestObject[2];
946         array2[0] = new TestObject(4);
947         array2[1] = new TestObject(5);
948         final TestObject[] array3 = new TestObject[3];
949         array3[0] = new TestObject(4);
950         array3[1] = new TestObject(5);
951         array3[2] = new TestObject(6);
952         
953         final Object obj1 = array1;
954         final Object obj2 = array2;
955         final Object obj3 = array3;
956         
957         assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
958         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
959         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
960         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
961 
962         array1[1] = new TestObject(7);
963         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
964         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
965     }
966 
967     @Test
968     public void testLongArrayHiddenByObject() {
969         final long[] array1 = new long[2];
970         array1[0] = 5L;
971         array1[1] = 6L;
972         final long[] array2 = new long[2];
973         array2[0] = 5L;
974         array2[1] = 6L;
975         final long[] array3 = new long[3];
976         array3[0] = 5L;
977         array3[1] = 6L;
978         array3[2] = 7L;
979         final Object obj1 = array1;
980         final Object obj2 = array2;
981         final Object obj3 = array3;
982         assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
983         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
984         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
985         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
986 
987         array1[1] = 7;
988         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
989         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
990     }
991 
992     @Test
993     public void testIntArrayHiddenByObject() {
994         final int[] array1 = new int[2];
995         array1[0] = 5;
996         array1[1] = 6;
997         final int[] array2 = new int[2];
998         array2[0] = 5;
999         array2[1] = 6;
1000         final int[] array3 = new int[3];
1001         array3[0] = 5;
1002         array3[1] = 6;
1003         array3[2] = 7;
1004         final Object obj1 = array1;
1005         final Object obj2 = array2;
1006         final Object obj3 = array3;
1007         assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
1008         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
1009         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
1010         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
1011 
1012         array1[1] = 7;
1013         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
1014         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
1015     }
1016 
1017     @Test
1018     public void testShortArrayHiddenByObject() {
1019         final short[] array1 = new short[2];
1020         array1[0] = 5;
1021         array1[1] = 6;
1022         final short[] array2 = new short[2];
1023         array2[0] = 5;
1024         array2[1] = 6;
1025         final short[] array3 = new short[3];
1026         array3[0] = 5;
1027         array3[1] = 6;
1028         array3[2] = 7;
1029         final Object obj1 = array1;
1030         final Object obj2 = array2;
1031         final Object obj3 = array3;
1032         assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
1033         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
1034         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
1035         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
1036 
1037         array1[1] = 7;
1038         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
1039         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
1040     }
1041 
1042     @Test
1043     public void testCharArrayHiddenByObject() {
1044         final char[] array1 = new char[2];
1045         array1[0] = 5;
1046         array1[1] = 6;
1047         final char[] array2 = new char[2];
1048         array2[0] = 5;
1049         array2[1] = 6;
1050         final char[] array3 = new char[3];
1051         array3[0] = 5;
1052         array3[1] = 6;
1053         array3[2] = 7;
1054         final Object obj1 = array1;
1055         final Object obj2 = array2;
1056         final Object obj3 = array3;
1057         assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
1058         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
1059         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
1060         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
1061 
1062         array1[1] = 7;
1063         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
1064         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
1065     }
1066 
1067     @Test
1068     public void testByteArrayHiddenByObject() {
1069         final byte[] array1 = new byte[2];
1070         array1[0] = 5;
1071         array1[1] = 6;
1072         final byte[] array2 = new byte[2];
1073         array2[0] = 5;
1074         array2[1] = 6;
1075         final byte[] array3 = new byte[3];
1076         array3[0] = 5;
1077         array3[1] = 6;
1078         array3[2] = 7;
1079         final Object obj1 = array1;
1080         final Object obj2 = array2;
1081         final Object obj3 = array3;
1082         assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
1083         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
1084         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
1085         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
1086 
1087         array1[1] = 7;
1088         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
1089         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
1090     }
1091 
1092     @Test
1093     public void testDoubleArrayHiddenByObject() {
1094         final double[] array1 = new double[2];
1095         array1[0] = 5;
1096         array1[1] = 6;
1097         final double[] array2 = new double[2];
1098         array2[0] = 5;
1099         array2[1] = 6;
1100         final double[] array3 = new double[3];
1101         array3[0] = 5;
1102         array3[1] = 6;
1103         array3[2] = 7;
1104         final Object obj1 = array1;
1105         final Object obj2 = array2;
1106         final Object obj3 = array3;
1107         assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
1108         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
1109         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
1110         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
1111 
1112         array1[1] = 7;
1113         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
1114         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
1115     }
1116 
1117     @Test
1118     public void testFloatArrayHiddenByObject() {
1119         final float[] array1 = new float[2];
1120         array1[0] = 5;
1121         array1[1] = 6;
1122         final float[] array2 = new float[2];
1123         array2[0] = 5;
1124         array2[1] = 6;
1125         final float[] array3 = new float[3];
1126         array3[0] = 5;
1127         array3[1] = 6;
1128         array3[2] = 7;
1129         final Object obj1 = array1;
1130         final Object obj2 = array2;
1131         final Object obj3 = array3;
1132         assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
1133         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
1134         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
1135         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
1136 
1137         array1[1] = 7;
1138         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
1139         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
1140     }
1141 
1142     @Test
1143     public void testBooleanArrayHiddenByObject() {
1144         final boolean[] array1 = new boolean[2];
1145         array1[0] = true;
1146         array1[1] = false;
1147         final boolean[] array2 = new boolean[2];
1148         array2[0] = true;
1149         array2[1] = false;
1150         final boolean[] array3 = new boolean[3];
1151         array3[0] = true;
1152         array3[1] = false;
1153         array3[2] = true;
1154         final Object obj1 = array1;
1155         final Object obj2 = array2;
1156         final Object obj3 = array3;
1157         assertTrue(new CompareToBuilder().append(obj1, obj1).toComparison() == 0);
1158         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() == 0);
1159         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
1160         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
1161 
1162         array1[1] = true;
1163         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
1164         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
1165     }
1166   
1167  }